Ordinary
About

MySQL UUID

profileordilov / 2022. 4. 24

UUID

UUID(universally unique identifier)는 128비트 식별자입니다. 분산된 환경에서 고유한 식별자를 위해 특정 서버에 의존하지 않고, 매우 높은 확률로 중복되지 않는 식별자를 만들 수 있습니다.

이렇게 생성하면 다음과 같은 장점들이 있습니다.

  • 서버를 거치거나 외부 통신 없이 고유한 식별자를 생성할 수 있습니다.
  • 값이 증가하거나 패턴이 있지 않아 ID를 추측해 처리하는 접근이 어려워집니다.

반면 단점으로는 식별자를 저장하기 위해 128비트를 저장해야하는 문제가 있습니다.

UUID를 만들 때는 각 언어에서 지원하는 UUID 생성 방법을 통해 만들 수 있습니다.

예시로 mysql에서 만드는 방법입니다.

select uuid()

java에서 만든다면 UUID.randomUUID()로 만들 수 있으며 구현은 다음과 같습니다.

public static UUID randomUUID() { SecureRandom ng = Holder.numberGenerator; byte[] randomBytes = new byte[16]; ng.nextBytes(randomBytes); randomBytes[6] &= 0x0f; /* clear version */ randomBytes[6] |= 0x40; /* set to version 4 */ randomBytes[8] &= 0x3f; /* clear variant */ randomBytes[8] |= 0x80; /* set to IETF variant */ return new UUID(randomBytes); }

MySQL에서 저장할 때

UUID가 128비트 식별자라고 했지만 실제 글자 수는 36글자로 '-' 문자 4개로 구분되어 있습니다.

aab5d5fd-70c1-11e5-a4fb-b026b977eb28

그대로 MySQL에 저장하는 경우 36글자를 차지하게 되는데 char이나 binary처럼 문자열 타입에 저장합니다. charbinary는 모두 문자를 저장하지만 binary의 경우는 바이트를 저장할 때 주로 쓰입니다. UUID에서의 문자도 16진수형 숫자들의 문자이므로 char보다 binary로 바이트 형태로 저장하는 것이 더 어울립니다.

'-' 문자는 식별하는데 도움이 되지 않기 때문에 이 값을 빼고 저장하면 32글자, 16바이트로 압축할 수 있습니다. 이처럼 UUID값을 binary(16) 형태로 변환할 때, MySQL 8.0에서는 UUID_TO_BIN() 함수를 제공합니다. 반대로 압축된 바이너리 값을 UUID 형태로 반환할 때는 BIN_TO_UUID() 함수를 사용하면 됩니다.

참조

https://dev.mysql.com/blog-archive/mysql-8-0-uuid-support/

https://dev.mysql.com/blog-archive/storing-uuid-values-in-mysql-tables/